package br.com.sebrae.pr.sgp.util.persistence;

import java.math.BigDecimal;
import java.sql.ResultSet;
import java.util.Date;
import java.util.Map;

import br.com.sebrae.pr.sgp.util.ConversionUtil;

import com.google.common.base.Preconditions;

/**
 * Classe que representa uma linha de retorno da execução de uma query qualquer.
 * 
 * @author Tanaka
 * 
 */
public class ItemResultset {

	private final Map<String, Object> colunas;

	public ItemResultset(final Map<String, Object> colunas) {
		Preconditions.checkNotNull(colunas, "Hash map não pode ser nulo!");
		this.colunas = colunas;
	}

	/**
	 * Obtém um {@link Long} do {@link Map} referente às colunas e valores de
	 * cada coluna do {@link ResultSet}
	 * 
	 * @param columnName
	 *            case insensitive
	 * @return {@link Long} ou null caso a coluna seja null
	 */
	public Long getLong(final String columnName) {
		if (getObject(columnName) == null) {
			return null;
		}
		return ConversionUtil.getLong(getObject(columnName));
	}

	/**
	 * Obtém um {@link Integer} do {@link Map} referente às colunas e valores de
	 * cada coluna do {@link ResultSet}
	 * 
	 * @param columnName
	 *            case insensitive
	 * @return {@link Integer} ou null caso a coluna seja null
	 */
	public Integer getInt(final String columnName) {
		if (getObject(columnName) == null) {
			return null;
		}
		return ConversionUtil.getInt(getObject(columnName));
	}

	/**
	 * Obtém um {@link Date} do {@link Map} referente às colunas e valores de
	 * cada coluna do {@link ResultSet}
	 * 
	 * @param columnName
	 *            case insensitive
	 * @return {@link Date} ou null caso a coluna seja null
	 */
	public Date getDate(final String columnName) {
		if (getObject(columnName) == null) {
			return null;
		}
		return ConversionUtil.getDate(getObject(columnName));
	}

	/**
	 * Obtém um {@link Boolean} do {@link Map} referente às colunas e valores de
	 * cada coluna do {@link ResultSet}
	 * 
	 * @param columnName
	 *            case insensitive
	 * @return {@link Boolean} ou null caso a coluna seja null
	 */
	public Boolean getBoolean(final String columnName) {
		if (getObject(columnName) == null) {
			return null;
		}
		return ConversionUtil.getBoolean(getObject(columnName));
	}

	/**
	 * Obtém um {@link String} do {@link Map} referente às colunas e valores de
	 * cada coluna do {@link ResultSet}
	 * 
	 * @param columnName
	 *            case insensitive
	 * @return {@link String} ou null caso a coluna seja null
	 */
	public String getString(final String columnName) {
		if (getObject(columnName) == null) {
			return null;
		}
		return ConversionUtil.getString(getObject(columnName));
	}

	/**
	 * Obtém um {@link BigDecimal} do {@link Map} referente às colunas e valores
	 * de cada coluna do {@link ResultSet}
	 * 
	 * @param columnName
	 *            case insensitive
	 * @return {@link BigDecimal} ou null caso a coluna seja null
	 */
	public BigDecimal getBigDecimal(final String columnName) {
		if (getObject(columnName) == null) {
			return null;
		}
		return ConversionUtil.getBigDecimal(getObject(columnName));
	}

	/**
	 * Obtém um {@link Object} do {@link Map} referente às colunas e valores de
	 * cada coluna do {@link ResultSet}
	 * 
	 * @param columnName
	 *            case insensitive
	 * @return {@link Object} com chave == columnName do {@link Map} interno
	 */
	public Object getObject(final String columnName) {
		return colunas
				.get(columnName != null ? columnName.toUpperCase() : null);
	}
}
